#include <iostream>
using namespace std;
#include <unistd.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <string.h>
#include <signal.h>

/*自定义处理信号的函数*/
void handleFunc(int sig)
{
    cout << "l am child process,l hit sig:" << sig << endl;
}

void handleAlarmFunc(int sig)
{
    cout << "alarm comming..." << endl;
    alarm(10);
}

int main()
{

#if 0
    int pipeFd[2] = {0};
    /*创建管道*/
    pipe(pipeFd);

    /*关闭管道的读端*/
    close(pipeFd[0]);

    const char *data = "hello world";
    write(pipeFd[1], data, sizeof(data));
#endif

#if 0
    /* 注册信号 */
    /* 信号的处理方式有三种
       1. 默认
       2. 忽略
       3. 自定义
    */

    // signal(SIGINT, handleFunc);
    // signal(SIGINT, SIG_DFL); // 默认
    signal(SIGINT, SIG_IGN); // 忽略
    signal(SIGQUIT, SIG_IGN);
    signal(SIGTSTP, SIG_IGN);

     while (1)
    {
        cout << "hello world" << endl;
        sleep(3);
    }
#endif

    /*创建进程*/

    pid_t pid = fork();
    if (pid < 0)
    {
        perror("fork error:");
        exit(-1);
    }
    else if (pid == 0)
    {
        /* 子进程 */
        /* 注册信号*/
        signal(SIGUSR1, handleFunc);

        signal(SIGALRM, handleAlarmFunc);

        /* 3秒 */
        alarm(10);

        cout << "child process." << endl;
    }
    else
    {
        /* 父进程 */
        usleep(1000);

        int cnt = 3;
        while (cnt--)
        {
            kill(pid, SIGUSR1);
            sleep(3);
        }
    }

    while (1)
    {
        sleep(1);
    }

    return 0;
}
